/**
 ***********************************************************************************************************
 * 
 ***********************************************************************************************************
 * @file RBFile.h
 ***********************************************************************************************************/

#ifndef __RBFILE_H__
#define __RBFILE_H__

#ifdef  HEADER_ONCE
#pragma HEADER_ONCE
#endif

#ifdef  HEADER_MSG
#pragma HEADER_MSG(RBFile.h)
#endif

/***********************************************************************************************************
 * Includes
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Forward declarations
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Classes
 ***********************************************************************************************************/

class RBFile
{
public:

    enum OpenMode
    {
        FOM_READ    = 1<<0,
        FOM_WRITE   = 1<<1,
    };

    static RBFile*      Open        (const char* pcFilename, uint32 eOpenMode = FOM_READ);
    static void         Close       (RBFile*&);

    uint32              GetSize     () const { return m_uiSize; }

    template <class T>
    void                ReadStruct  (T* buffer, uint32 count=1) { Read((char*)buffer, sizeof(T)*count); }

    void                Read        (char* pcBuffer, uint32 uiSize);
    void                Write       (const char* pcBuffer, uint32 uiSize);

    void                Seek        ();

private:
				        RBFile      ();
    virtual            ~RBFile      ();

    bool                Load        (const char* pcFilename, uint32 eOpenMode);
    void                Close       ();

    std::fstream        m_kFile;
    uint32              m_uiSize;
};


/***********************************************************************************************************/

#endif // __RBFILE_H__